package kr.co.bettersoft.waitnumbercustomer.activity;

import java.util.Locale;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import kr.co.bettersoft.waitnumbercustomer.activity.PrefActivity.RunnableGetUserInfo;
import kr.co.bettersoft.waitnumbercustomer.activity.PrefActivity.RunnableUpdateGCMToServer;
import kr.co.bettersoft.waitnumbercustomer.activity.PrefActivity.RunnableUpdateToServer;
import kr.co.bettersoft.waitnumbercustomer.activity.PrefActivity.backgroundThreadGetUserInfo;
import kr.co.bettersoft.waitnumbercustomer.common.CommonConstant;
import kr.co.bettersoft.waitnumbercustomer.common.WaitNumberCustomerRest;
import kr.co.bettersoft.waitnumbercustomer.domain.MemberUser;

import org.json.JSONException;
import org.json.JSONObject;

import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.preference.EditTextPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceManager;
import android.preference.PreferenceScreen;
import android.preference.Preference.OnPreferenceChangeListener;
import android.util.Log;
import android.widget.Toast;
/**
 * PrefUserInfoActivity
 * 
 * 설정탭에서 개인정보를 선택하였을때 이동되는 개인정보 설정 화면이다. (하위 설정 메뉴)
 *  이메일을 등록할 수 있다.
 */
public class PrefUserInfoActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener{
///////////////////////////////////////////////////////////////////////////////////////
// 상수
	
	static String TAG = "PrefUserInfoActivity";
	
	public final int UPDATE_TO_SERVER = 601; // 이벤트 목록 가져오는 함수

	SharedPreferences sharedPrefCustom;		// 공용 프립스		 		
	SharedPreferences defaultPref;			// default --  자체 프리퍼런스. 

	int sharePrefsFlag = 1;					 

	// 서버 통신 용
//	WaitNumberCustomerRest waitNumberCustomerRest;
//	String callResult = "";
//	String tempstr = "";
//	JSONObject jsonObject;
	
	static int updateLv=0;							// 서버에 업뎃 칠지 여부 검사용도. 0이면 안하고, 1이면 한다, 2면 두번한다(업뎃중 값이 바뀐 경우이다)
	String updateYN = "";

	// Locale
	Locale systemLocale = null ;
	String strCountry = "" ;
	String strLanguage = "" ;

	// qr
	String qrCode = "";
	
	MemberUser memberInfo;
	
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	
	// 핸들러 등록					
	Handler handler = new Handler(){
		@Override
		public void handleMessage(Message msg){
			Bundle b = msg.getData();
			
			switch (msg.what)
			{
				case UPDATE_TO_SERVER   : runOnUiThread(new RunnableUpdateToServer());
					break;
				default : 
					break;
			}
		}
	};
	
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		addPreferencesFromResource(R.xml.settings_myinfo);
		
//		WaitNumberCustomerRest waitNumberCustomerRest = new WaitNumberCustomerRest(); 
		
		/*
		 *  서버로부터 개인 정보를 가져와서 도메인 같은 곳에 담아둔다. 나중에 업데이트 할때 사용. 업데이트하고 나면 그 도메인 그대로 유지..
		 */
		memberInfo = new MemberUser();
		/*
		 * 메일 변경시. 서버에 업뎃.
		 */
		EditTextPreference pref_user_email = (EditTextPreference)findPreference("pref_user_email");
		
		pref_user_email.setOnPreferenceChangeListener(new OnPreferenceChangeListener()  {
			@Override
			public boolean onPreferenceChange(Preference arg0, Object arg1) {		// 메일 정보 변경.  사용자 입력 값
				Log.d(TAG, "arg0::"+arg0+",,arg1::"+arg1);		// 변경된 값을 받아옴.
				if(isValidEmail((String) arg1)){
					memberInfo.setEmail((String) arg1);
					if(updateLv<2){		// 0또는 1일경우. 1 증가. (최대 2까지)
						updateLv = updateLv+1;
						if(updateLv==1){
							// 서버에 업데이트
							handler.sendEmptyMessage(UPDATE_TO_SERVER);
						}
					}
					return true;
				}else{
					Toast.makeText(PrefUserInfoActivity.this, R.string.invalid_email, Toast.LENGTH_SHORT).show();
					return false;
				}
			}
		});

		getPreferenceScreen().getSharedPreferences() 
		.registerOnSharedPreferenceChangeListener(this); 
		
		
		// prefs 	// 어플 잠금 설정. 공용으로 쓸것도 필요 
		sharedPrefCustom = getSharedPreferences(CommonConstant.prefName,			
				Context.MODE_WORLD_READABLE | Context.MODE_WORLD_WRITEABLE);
		sharedPrefCustom.registerOnSharedPreferenceChangeListener(this);			// 여기에도 등록해놔야 리시버가 제대로 반응한다.
		// default pref
		defaultPref = PreferenceManager.getDefaultSharedPreferences(this);
		defaultPref.registerOnSharedPreferenceChangeListener(this);			

		// 저장된 QR코드
		qrCode = sharedPrefCustom.getString("qrCode","");
		
		// 프립에 저장된 이메일 값으로 세팅
		pref_user_email.setText(sharedPrefCustom.getString("pref_user_email",""));
		
		SharedPreferences.Editor init2 = sharedPrefCustom.edit();			// 동기화 위해 강제 호출용도  .. 단어명은 의미없음.
		int someNum = sharedPrefCustom.getInt("someNum", sharePrefsFlag);	// 이전 값과 같을수 있으므로..
		someNum = someNum * -1;													// 매번 다른 값이 들어가야 제대로 호출이 된다. 같은 값들어가면 변화 없다고 호출 안됨.			
		init2.putInt("someNum", someNum); 									// 프리퍼런스 값 넣어 업데이트 시키면 강제로 리스너 호출.
		init2.commit();			
		// 자체 프리퍼를 지목할 수 있게 됨. 
	}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 
	
	/**
	 * 러너블.  서버로 변경된 설정 등을 업데이트 한다
	 */
	class RunnableUpdateToServer implements Runnable {
		public void run(){
			new backgroundThreadUpdateToServer().execute();	// * 
		}
	}
	/**
	 * backgroundThreadUpdateToServer
	 * 비동기 스레드  서버로 변경된 설정 등을 업데이트 한다
	 * @author blue
	 *
	 */
	public class backgroundThreadUpdateToServer extends AsyncTask<Void, Void, Void>{
		@Override protected void onPostExecute(Void result) {  
		} 
		@Override protected void onPreExecute() {  
		} 
		@Override protected Void doInBackground(Void... params) {  
			Log.d(TAG,"backgroundThreadUpdateToServer");
			
			// 파라미터 세팅
			MemberUser memberUserParam = new MemberUser();
			memberUserParam.setQrCode(qrCode);
			memberUserParam.setEmail(memberInfo.getEmail());
			// 서버 메소드 호출
			WaitNumberCustomerRest waitNumberCustomerRest = new WaitNumberCustomerRest(); 
			String callResult = waitNumberCustomerRest.RestUpdateToServer(memberUserParam);
			// 결과 처리 
			if(!(callResult.equals("F"))){
				try {
					JSONObject jsonObject = new JSONObject(callResult);
					String strResult = jsonObject.getString("result").toString(); 
//					Log. d(TAG,"strResult:"+strResult);
					if((strResult.equals("SUCCESS"))){
						Log.d(TAG,"S to update to server");
						updateLv = updateLv-1;
						if(updateLv>0){		// 2였던 경우. (업뎃중 또 변경된 경우 한번더)
							Log.d(TAG,"Need Update one more time");
							handler.sendEmptyMessage(UPDATE_TO_SERVER);
						}
					}
				} catch (JSONException e) {
					e.printStackTrace();
				} 
			}else{
				Log.w(TAG,"fail to update");
			}
			return null; 
		}
	}
	
	
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 고유 기능
	
	/**
	 * onPreferenceTreeClick
	 *  Preference에서 클릭 발생시 호출된다. 생년월일 변경 메뉴로 들어가면 기존 생일 또는 오늘 날짜를 기본값으로 날짜피커를 보여준다.
	 *	// Preference에서 클릭 발생시 호출되는 call back    -- 해당 설정창.
	 *	// Parameters:
	 *	//  - PreferenceScreen : 이벤트가 발생한 Preference의 root
	 *	//  - Preference : 이벤트를 발생시킨 Preference 항목
	 * @param preferenceScreen
	 * @param preference
	 * @return
	 */
	@Override
	public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
			Preference preference) {
		return super.onPreferenceTreeClick(preferenceScreen, preference);
	}	


	@Override
	public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
			String key) {
		if(key.equals("someNum")){		// resume 에서 넣은 것과 이름 일치해야 동작한다.
			sharedPrefCustom = sharedPreferences;		// 프리퍼런스 동기화
		}
	}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////	
// 유틸

	/**
	 * isValidEmail
	 * 이메일주소 유효검사
	 * 
	 * @author   Sehwan Noh <sehnoh@gmail.com>
	 * @version  1.0 - 2006. 08. 22
	 * @since    JDK 1.4
	 * @param email
	 */
	public static boolean isValidEmail(String email) {
		Pattern p = Pattern.compile("^(?:\\w+\\.?)*\\w+@(?:\\w+\\.)+\\w+$");
		Matcher m = p.matcher(email);
		return m.matches();
	}
	
	/**
	 * onPause
	 * 액티비티 중지시 스레드를 초기화한다.
	 */
	@Override 
	protected void onPause() { 
		super.onPause(); 
		// Unregister the listener whenever a key changes 	
		getPreferenceScreen().getSharedPreferences() 		
		.unregisterOnSharedPreferenceChangeListener(this); 
	} 
	
}
